#include "muscle.h"

// Pascaralle and Argos gap factors
// after Table 1 in Thompson et. al. ClustalW NAR paper.
static double PAFFacs[20] =
	{
	1.13,		// A
	1.13,		// C
	0.96,		// D
	1.31,		// E
	1.20,		// F
	0.61,		// G
	1.00,		// H
	1.32,		// I
	0.96,		// K
	1.21,		// L
	1.29,		// M
	0.62,		// N
	0.74,		// P
	1.07,		// Q
	0.72,		// R
	0.76,		// S
	0.89,		// T
	1.25,		// V
	1.00,		// Y
	1.23,		// W
	};

// (Not used: does not appear to work well).
SCORE PAFactor(const FCOUNT fcCounts[])
	{
	if (ALPHA_Amino != g_Alpha)
		Quit("PAFFactor: requires amino acid sequence");

	FCOUNT fLetterCount = 0;
	double dSum = 0;
	for (unsigned uLetter = 0; uLetter < 20; ++uLetter)
		{
		const FCOUNT fCount = fcCounts[uLetter];
		dSum += fCount*PAFFacs[uLetter];
		fLetterCount += fCount;
		}
	if (0 == fLetterCount)
		return 0.5;
	return (SCORE) (dSum/fLetterCount);
	}

static bool Hydrophilic[20] =
	{
	false,		// A
	false,		// C
	true,		// D
	true,		// E
	false,		// F
	true,		// G
	false,		// H
	false,		// I
	true,		// K
	false,		// L
	false,		// M
	true,		// N
	true,		// P
	true,		// Q
	true,		// R
	true,		// S
	false,		// T
	false,		// V
	false,		// Y
	false,		// W
	};

bool IsHydrophilic(const FCOUNT fcCounts[])
	{
	if (ALPHA_Amino != g_Alpha)
		Quit("IsHydrophilic: requires amino acid sequence");

	for (unsigned uLetter = 0; uLetter < 20; ++uLetter)
		if (fcCounts[uLetter] > 0 && !Hydrophilic[uLetter])
			return false;
	return true;
	}

bool IsHydrophilic(const unsigned uCounts[])
	{
	if (ALPHA_Amino != g_Alpha)
		Quit("IsHydrophilic: requires amino acid sequence");

	for (unsigned uLetter = 0; uLetter < 20; ++uLetter)
		if (uCounts[uLetter] > 0 && !Hydrophilic[uLetter])
			return false;
	return true;
	}

// LIVCATMFYWHK
// Venn		Pascaralla	B&T		Me
// L		y			y		y
// I		y			y		y
// V		y			y		y
// C		y			n
// A		y			y		y
// T		N			n
// M		y			y		y
// F		y			y		y
// Y		n			n
// W		y			n
// H		n			n
// K		n			n
static bool Hydrophobic[20] =
	{
	true,		// A
	true,		// C
	false,		// D
	false,		// E
	true,		// F
	false,		// G
	true,		// H
	true,		// I
	false,		// K
	true,		// L
	true,		// M
	false,		// N
	false,		// P
	false,		// Q
	false,		// R
	false,		// S
	true,		// T
	true,		// V
	true,		// Y
	true,		// W
	};

bool IsHydrophobic(const FCOUNT fcCounts[])
	{
	if (ALPHA_Amino != g_Alpha)
		Quit("IsHydrophobic: requires amino acid sequence");

	for (unsigned uLetter = 0; uLetter < 20; ++uLetter)
		if (fcCounts[uLetter] > 0.0 && !Hydrophobic[uLetter])
			return false;
	return true;
	}
